/**
 * @namespace 地理位置探测模块
 * @name JF.geo
 * @author levinhuang
 * @version 1.0alpha
 * @requires jQuery,JF
 */
JF.M("geo",(function($){

	var p={},
		/** @scope JF.geo.prototype */
		pub={};

	
	p.geo={
		init:function(){
			//浏览器不支持地理位置功能...
			if(!navigator.geolocation){
				if(p.opts.onGeoInit){
					p.opts.onGeoInit({geo:p.geo});
				};
				return;
			};

			navigator.geolocation.getCurrentPosition(this.ok,this.error);
		},
		ok:function(pos){
			$(p.geo).trigger("onOK",[{
				"pos":pos
			}]);	
		},
		error:function(err){
			$(p.geo).trigger("onError",[{
				"err":err
			}]);
		},
		bind:function(evtName,cbk){
			$(this).bind(evtName,cbk);
		},
		unbind:function(evtFlag){
			if(!evtFlag){
				$(this).unbind();
				return;
			}

			$(this).unbind(evtFlag);
		}
	};

	p.qqmap={
		url:'http://s.map.qq.com/api/js/beta/v2.1/QQMapAPI.js',
		geocode:function(opts){

			var action=function(){
				var geo=new QQMap.QGeocoder(),
					latlng = new QQMap.QLatLng(parseFloat(opts.x),parseFloat(opts.y));
				geo.geocode({'location': latlng}, function(results, status) {
					if (status == QQMap.QGeocoderStatus.OK) {
						opts.cbk(results,true);
					} else {
						opts.cbk(results,false);
					}
				});
			};
			
			//按需加载QQMAP
			if(!window["QQMap"]){
				this.init(function(){
					action();
				});
			}else{
				action();
			}
		},
		init:function(cbk){
			$.getScript(this.url,function(){
				cbk();
			});
		}
	};

	/** 
	 * 初始化地址位置模块
	 * @public
	 * @function
	 * @name JF.geo.init
	 * @param {Object} opts 配置对象
	 * @example
	 * JF.init({onGeoInit:yourCustomGeoProccess});
	 */
	pub.init=function(opts){
		p.opts=$.extend({
			onGeoInit:null
		},opts||{});
	};

	/**
	 * 添加事件监听函数
	 * @function
	 * @name JF.geo.AddListener
	 * @param {Function} cbk 事件处理函数
	 * @param {Boolean} opts 配置对象
	 * @example 
	 * 参数opts示例
	 * var opts={
	 *		error:true,//是否是位置探测失败时的事件处理
	 *		ns:''//事件的命名空间
	 * };
	 */
	pub.AddListener=function(cbk,opts){
			opts=$.extend({
				error:false,
				ns:''
			},opts||{});

			var evtFlag=(opts.error?"onError":"onOK")+(opts.ns!==''?('.'+opts.ns):'');

			p.geo.bind(evtFlag,function(e,data){
				cbk(data);
			});

			return this;
	};
	
	pub.RemoveListener=function(evtFlag){
		//移除指定的事件处理函数
		p.geo.unbind(evtFlag);

		return this;
	};

	pub.Fire=function(){
		p.geo.init();
	};

	pub.Geocode=$.proxy(p.qqmap.geocode,p.qqmap);

	return pub;

})(jQuery));